热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

红线|死扣_Android自定义刻度尺的实现思路以及步骤

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android自定义刻度尺的实现思路以及步骤相关的知识,希望对你有一定的参考价值。最近一直在学自定义view࿰

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android自定义刻度尺的实现思路以及步骤相关的知识,希望对你有一定的参考价值。


最近一直在学自定义view,博大精深,感觉如果向底层看的话,功力不够且时间不允许,所以一直都是停留在怎么实现自定义view上,而为何会这么实现以及差异并没有考虑的很清晰,因为面向对象编程以及封装,都是让我们将功能抽出来使用,而不是去考虑每个功能里是怎么实现的,所以很苦恼,还是先实现吧,至于原理慢慢理解吧!

这是自定义View学习的第三篇,学习主要是在项目的基础上来学,并不是一点点的基础死扣,因为你看懂,敲出来一个自定义view的代码,你就会慢慢有所理解,包括中间的一些计算,所以还是建议大家先去敲代码,自己写不出来,就把别人的代码敲一遍,去理解一遍,比仅仅去看会领悟的更多,这就有点书读百遍,其义自现的意思,哈哈,一点浅见,谁让我笨呢。

今天讲一下自定义刻度尺的实现,咋听刻度尺,难度并不高,但是对于刚刚开始动手敲,摆脱Ctrl+c/Ctrl+z的同学来说还是有些难度的。

看看我的实现效果吧:

横向显示10cm,模拟器暂时找不到横屏,就这样吧!@_@

思路呢?

刚开始敲的时候,先明确思路,磨刀不误砍柴工,进去就敲最后敲得自己也糊涂了!



1:画刻度尺
2:画刻度数
3:画红线标记
4:处理滑动


画刻度尺

canvas.save();
for (int i &#61; min; i <max; i&#43;&#43;)
if (i % 10 &#61;&#61; 0)
//起点x坐标10像素&#xff0c;画厘米线
canvas.drawLine(10, 0, 10, 72, mLinePaint);
String text &#61; i / 10 &#43; "";
Rect rect &#61; new Rect();
float txtWidth &#61; mTextPaint.measureText(text);
mTextPaint.getTextBounds(text, 0, text.length(), rect);
canvas.drawText(text, 10 - txtWidth / 2, 72 &#43; rect.height() &#43; 10, mTextPaint);
else if (i % 5 &#61;&#61; 0)
//每隔0.5cm画间隔线
canvas.drawLine(10, 0, 10, 64, mLinePaint);
else
//画毫米线
canvas.drawLine(10, 0, 10, 48, mLinePaint);

//每隔18像素移动一次&#xff0c;达到画线效果
canvas.translate(18, 0);

canvas.restore();

画刻度数

if (i % 10 &#61;&#61; 0)
//起点x坐标10像素&#xff0c;画厘米线
canvas.drawLine(10, 0, 10, 72, mLinePaint);
//计算刻度数
String text &#61; i / 10 &#43; "";
Rect rect &#61; new Rect();
//获取文本宽度
float txtWidth &#61; mTextPaint.measureText(text);
mTextPaint.getTextBounds(text, 0, text.length(), rect);
//画字
canvas.drawText(text, 10 - txtWidth / 2, 72 &#43; rect.height() &#43; 10, mTextPaint);

画红线标记

看效果图&#xff1a;

很明显&#xff0c;是一条线&#xff0c;外加一个圆。计算好距离就ok。

//画线
canvas.drawLine(progrees, 0, progrees, 160, mRulerPaint);
//线下画圆
canvas.drawCircle(progrees, 170, 10, mRulerPaint);
BigDecimal bd &#61; new BigDecimal((progrees - 18) / 180);
bd &#61; bd.setScale(1, BigDecimal.ROUND_HALF_UP);
//计算刻度数&#xff0c;保留一位小数&#xff0c;单位cm
mTextPaint.setTextSize(48);
canvas.drawText(bd.floatValue() &#43; "cm", 500, 400, mTextPaint);

progrees是手指触摸的x轴坐标&#xff0c;线高160&#xff0c;圆心y轴坐标170&#xff0c;半径10即可。

处理滑动

&#64;Override
public boolean onTouchEvent(MotionEvent event)
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
isCanMove &#61; true;
break;
case MotionEvent.ACTION_MOVE:
if (!isCanMove)
return false;

//前面0坐标线从10像素开始&#xff0c;故而计算的时候要-10
float x &#61; event.getX() - 10;
progrees &#61; x;
//刷新
invalidate();
break;

return true;

绘画步骤就是这么多。

完整代码&#xff1a;

package com.example.com.testview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.math.BigDecimal;
/**
* 刻度尺
* Created by Administrator on 2016/9/14.
*/

public class ScaleView extends View
private Paint mLinePaint;
private Paint mTextPaint;
private Paint mRulerPaint;
private float progrees &#61; 10;
private int max &#61; 101;
private int min &#61; 0;
private boolean isCanMove;
public ScaleView(Context context)
super(context);
init();

public ScaleView(Context context, AttributeSet attrs)
super(context, attrs);
init();

public ScaleView(Context context, AttributeSet attrs, int defStyleAttr)
super(context, attrs, defStyleAttr);
init();

private void init()
mLinePaint &#61; new Paint();
mLinePaint.setColor(Color.CYAN);
mLinePaint.setAntiAlias(true);//抗锯齿
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setStrokeWidth(4);
mTextPaint &#61; new Paint();
mTextPaint.setColor(Color.CYAN);
mTextPaint.setAntiAlias(true);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setStrokeWidth(2);
mTextPaint.setTextSize(48);
//
mRulerPaint &#61; new Paint();
mRulerPaint.setAntiAlias(true);
mRulerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mRulerPaint.setColor(Color.RED);
mRulerPaint.setStrokeWidth(4);

&#64;Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(setMeasureWidth(widthMeasureSpec), setMeasureHeight(heightMeasureSpec));

private int setMeasureHeight(int spec)
int mode &#61; MeasureSpec.getMode(spec);
int size &#61; MeasureSpec.getSize(spec);
int result &#61; Integer.MAX_VALUE;
switch (mode)
case MeasureSpec.AT_MOST:
size &#61; Math.min(result, size);
break;
case MeasureSpec.EXACTLY:
break;
default:
size &#61; result;
break;

return size;

private int setMeasureWidth(int spec)
int mode &#61; MeasureSpec.getMode(spec);
int size &#61; MeasureSpec.getSize(spec);
int result &#61; Integer.MAX_VALUE;
switch (mode)
case MeasureSpec.AT_MOST:
size &#61; Math.min(result, size);
break;
case MeasureSpec.EXACTLY:
break;
default:
size &#61; result;
break;

return size;

&#64;Override
protected void onDraw(Canvas canvas)
super.onDraw(canvas);
canvas.save();
for (int i &#61; min; i if (i % 10 &#61;&#61; 0)
canvas.drawLine(10, 0, 10, 72, mLinePaint);
String text &#61; i / 10 &#43; "";
Rect rect &#61; new Rect();
float txtWidth &#61; mTextPaint.measureText(text);
mTextPaint.getTextBounds(text, 0, text.length(), rect);
canvas.drawText(text, 10 - txtWidth / 2, 72 &#43; rect.height() &#43; 10, mTextPaint);
else if (i % 5 &#61;&#61; 0)
canvas.drawLine(10, 0, 10, 64, mLinePaint);
else
canvas.drawLine(10, 0, 10, 48, mLinePaint);

canvas.translate(18, 0);

canvas.restore();
canvas.drawLine(progrees, 0, progrees, 160, mRulerPaint);
canvas.drawCircle(progrees, 170, 10, mRulerPaint);
BigDecimal bd &#61; new BigDecimal((progrees - 18) / 180);
bd &#61; bd.setScale(1, BigDecimal.ROUND_HALF_UP);
mTextPaint.setTextSize(48);
canvas.drawText(bd.floatValue() &#43; "cm", 500, 400, mTextPaint);

&#64;Override
public boolean onTouchEvent(MotionEvent event)
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
isCanMove &#61; true;
break;
case MotionEvent.ACTION_MOVE:
if (!isCanMove)
return false;

float x &#61; event.getX() - 10;
progrees &#61; x;
invalidate();
break;

return true;

布局&#xff1a;

<com.example.com.testview.ScaleView
android:layout_width&#61;"wrap_content"
android:layout_height&#61;"wrap_content"
android:layout_margin&#61;"4dp"/>

现在看一下横向效果&#xff1a;

代码就不上传了&#xff0c;上面就是。


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
author-avatar
手机用户2502855061
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有